package com.guoxin.part4.chapter20;

import java.util.LinkedList;

/**
 * @author guoxin
 * @date 2019/8/31
 */
public class GuardedSuspensionQueue {
    // 定义存放 Integer类型的queue
    private final LinkedList<Integer> queue = new LinkedList<>();

    // 定义queue的最大容量为100
    private final int LIMIT = 100;

    // 往queue中插入数据，如果queue中的元素超过了最大容量，则会陷入阻塞
    public void offer(Integer data) throws InterruptedException {
        synchronized (this) {
            while (queue.size() >= LIMIT) {
                this.wait();
            }
            queue.addLast(data);
            this.notifyAll();
        }
    }

    // 从队列中获取元素，如果队列此时为空，则会使当前线程阻塞
    public Integer take() throws InterruptedException {
        synchronized (this) {
            while (queue.isEmpty()) {
                this.wait();
            }
            this.notifyAll();
            return queue.removeFirst();
        }
    }
}
